package com.wavehi.dao;

import com.wavehi.util.JDBCUtils;
import com.wavehi.util.JDBCUtilsUp;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.*;
import java.util.List;

/**
 * @Author WaveHi
 * @Date 2/9/2021 上午 10:53
 * @Version 1.0
 * @Contact HJBWaveHi@163.com
 * @Description 数据库常用操作
 */
public abstract class BaseDao {
    private QueryRunner qr = new QueryRunner();//操作数据库

    /**
     * 增删改
     * @param sql
     * @param args
     */
    public void update(String sql, Object... args) {
        //获取数据库连接
        Connection conn = JDBCUtilsUp.getConnection();
        //执行sql语句
        try {
            qr.update(conn,sql,args);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            JDBCUtilsUp.rollbackAndClose();
        }finally {
            //资源关闭
            JDBCUtilsUp.commitAndClose();

        }
    }

    /**
     * 查询一个对象
     * @param clz
     * @param sql
     * @param args
     * @param <T>
     * @return
     */
    public <T> T selectForOne(Class<T> clz, String sql,Object... args) {
        //获取数据库连接
        Connection conn = JDBCUtilsUp.getConnection();
        //执行sql语句
        try {
            return qr.query(conn,sql, new BeanHandler<T>(clz),args);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return null;
        }finally {
            JDBCUtilsUp.commitAndClose();
        }
    }

    /**
     * 查询多个对象
     * @param clz
     * @param sql
     * @param args
     * @param <T>
     * @return
     */
    public <T> List<T> selectForList(Class<T> clz, String sql, Object... args) {
        //获取数据库连接
        Connection conn = JDBCUtilsUp.getConnection();
        //执行sql语句
        try {
            //返回结果
            return qr.query(conn,sql,new BeanListHandler<T>(clz),args);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return null;
        }finally {
            JDBCUtilsUp.commitAndClose();
        }
    }

    /**
     * 获取单个值
     * @param clz
     * @param sql
     * @param args
     * @param <T>
     * @return
     */
    public <T> Object selectForValue(Class<T> clz, String sql, Object... args) {
        //获取数据库连接
        Connection conn = JDBCUtilsUp.getConnection();
        try {
            //执行sql语句
            return qr.query(conn,sql, new ScalarHandler(), args);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            //返回结果
            return null;
        } finally {
            //资源的关闭
            JDBCUtilsUp.commitAndClose();
        }
    }

}
